import time
import requests
from datetime import datetime

# Django REST framework API地址，用于发送故障信息
API_URL = "http://222.134.245.144:17000/weizhang/VioModel/"

# 定义函数，用于将故障信息推送到REST API
def send_fault_to_api(fault_info):
    """推送故障信息到REST API"""
    try:
        # 发送POST请求，将故障信息以JSON格式发送到指定的API地址
        response = requests.post(API_URL, json=fault_info)
        if response.status_code == 201:
            # 如果请求成功（状态码为201），打印成功推送的信息
            print(f"✅ 故障推送成功：{fault_info['gu_zhang_miao_shu']}")
        else:
            # 如果请求失败，打印失败信息，包含状态码和响应内容
            print(f"❌ 推送失败，状态码：{response.status_code}，响应：{response.text}")
    except requests.exceptions.RequestException as e:
        # 如果请求过程中出现异常，打印异常信息
        print(f"🚫 网络请求失败：{str(e)}")

# 定义函数，用于检测液缸是否串漏
def ye_gang_chuan_lou():
    # 模拟从API获取的数据
    data = {
        "results": [
            {
                "id": 1,
                "liu_liang_ji": "27.3625",  # 主流量计数值
                "wan_neng_ya_li": "27.74375",  # 万能压力值
                "guan_hui_ya_li": "3000",  # 管汇压力值
                "chu_neng_qi_ya_li": "3000",  # 储能器压力值
                "zuan_ji_qi_ya": "3000",  # 钻机气压值
                "pang_tong": {
                    "hong_yali": False,  # 旁路的红压力状态
                    "hong_deng": True,  # 旁路的红灯状态
                    "lv_yali": True,  # 旁路的绿压力状态
                    "lv_deng": True  # 旁路的绿灯状态
                },
                "wan_neng": {
                    "hong_yali": False,  # 万能设备的红压力状态
                    "hong_deng": False,  # 万能设备的红灯状态
                    "lv_yali": True,  # 万能设备的绿压力状态
                    "lv_deng": True  # 万能设备的绿灯状态
                },
                "dian_beng_1": {
                    "deng": True,  # 电机泵1的灯状态
                },
                "dian_beng_2": {
                    "deng": True,  # 电机泵2的灯状态
                },
                "shang_ya_jing": {
                    "hong_yali": False,  # 上压井设备的红压力状态
                    "hong_deng": False,  # 上压井设备的红灯状态
                    "lv_yali": False,  # 上压井设备的绿压力状态
                    "lv_deng": False  # 上压井设备的绿灯状态
                },
                "ke_bian_zha_ban": {
                    "hong_yali": False,  # 可变闸板设备的红压力状态
                    "hong_deng": False,  # 可变闸板设备的红灯状态
                    "lv_yali": False,  # 可变闸板设备的绿压力状态
                    "lv_deng": False  # 可变闸板设备的绿灯状态
                },
                "shang_zu_liu": {
                    "hong_yali": False,  # 上组流设备的红压力状态
                    "hong_deng": False,  # 上组流设备的红灯状态
                    "lv_yali": False,  # 上组流设备的绿压力状态
                    "lv_deng": False  # 上组流设备的绿灯状态
                },
                "xia_ya_jing": {
                    "hong_yali": False,  # 下压井设备的红压力状态
                    "hong_deng": False,  # 下压井设备的红灯状态
                    "lv_yali": False,  # 下压井设备的绿压力状态
                    "lv_deng": False  # 下压井设备的绿灯状态
                },
                "jian_qie_zha_ban": {
                    "hong_yali": False,  # 剪切闸板设备的红压力状态
                    "hong_deng": False,  # 剪切闸板设备的红灯状态
                    "lv_yali": False,  # 剪切闸板设备的绿压力状态
                    "lv_deng": False  # 剪切闸板设备的绿灯状态
                },
                "xia_zu_liu": {
                    "hong_yali": False,  # 下组流设备的红压力状态
                    "hong_deng": False,  # 下组流设备的红灯状态
                    "lv_yali": False,  # 下组流设备的绿压力状态
                    "lv_deng": False  # 下组流设备的绿灯状态
                },
                "bei_yong_fa": {
                    "hong_yali": False,  # 备用阀的红压力状态
                    "hong_deng": False,  # 备用阀的红灯状态
                    "lv_yali": False,  # 备用阀的绿压力状态
                    "lv_deng": False  # 备用阀的绿灯状态
                },
                "shang_zha_ban": {
                    "hong_yali": False,  # 上闸板设备的红压力状态
                    "hong_deng": False,  # 上闸板设备的红灯状态
                    "lv_yali": False,  # 上闸板设备的绿压力状态
                    "lv_deng": False  # 上闸板设备的绿灯状态
                },
                "xia_zha_ban": {
                    "hong_yali": False,  # 下闸板设备的红压力状态
                    "hong_deng": False,  # 下闸板设备的红灯状态
                    "lv_yali": False,  # 下闸板设备的绿压力状态
                    "lv_deng": False  # 下闸板设备的绿灯状态
                },
                "jin_ji_dian_yuan": {
                    "deng": True,  # 紧急电源的灯状态
                },
                "div_tong_xin": {
                    "deng": True,  # 通讯设备的灯状态
                },
                "HPU_tong_xin": {
                    "deng": True,  # HPU通讯设备的灯状态
                },
                "bao_jing": {
                    "deng": True,  # 报警设备的灯状态
                },
                "lei_ji_power_low": {
                    "deng": True,  # 累计功率低的灯状态
                },
                "ye_wei_low": {
                    "deng": True,  # 液位低的灯状态
                },
                "zuan_ji_qi_ya_low": {
                    "deng": True,  # 钻机气压低的灯状态
                },
                "beng_ya_li_low": {
                    "deng": True,  # 泵压力低的灯状态
                },
                "updated": "2025-02-14T10:50:34.521938",  # 数据更新时间
                "created": "2025-02-14T10:50:34.521938"  # 数据创建时间
            }
        ]
    }

    # 从数据中获取主流量计的当前流量值，并转换为浮点数
    main_flow_rate = float(data["results"][0]["liu_liang_ji"])
    # 定义需要检查的功能设备列表
    functions = [
        "wan_neng", "shang_ya_jing", "ke_bian_zha_ban", "shang_zu_liu",
        "xia_ya_jing", "jian_qie_zha_ban", "xia_zu_liu", "shang_zha_ban", "xia_zha_ban"
    ]

    # 定义各功能设备的标准流量值
    standard_flow_values = {
        "wan_neng": 10,
        "shang_ya_jing": 8,
        "ke_bian_zha_ban": 9,
        "shang_zu_liu": 7,
        "xia_ya_jing": 6,
        "jian_qie_zha_ban": 8,
        "xia_zu_liu": 7,
        "shang_zha_ban": 9,
        "xia_zha_ban": 8
    }

    # 定义内部函数，用于判断有多少个功能设备的压力状态为True
    def pan_duan():
        # 初始化压力状态为True的设备数量
        true_count = 0
        # 初始化压力状态为True的设备名称
        true_function = None
        # 初始化压力状态为True的压力类型（红压力或绿压力）
        true_yali = None
        # 遍历需要检查的功能设备列表
        for func in functions:
            # 获取当前设备的详细数据
            func_data = data["results"][0].get(func)
            if func_data:
                # 检查当前设备的红压力状态是否为True
                if func_data.get("hong_yali"):
                    # 如果为True，压力状态为True的设备数量加1
                    true_count += 1
                    # 记录当前设备名称
                    true_function = func
                    # 记录当前压力类型为红压力
                    true_yali = "hong_yali"
                # 检查当前设备的绿压力状态是否为True
                if func_data.get("lv_yali"):
                    # 如果为True，压力状态为True的设备数量加1
                    true_count += 1
                    # 记录当前设备名称
                    true_function = func
                    # 记录当前压力类型为绿压力
                    true_yali = "lv_yali"
        # 返回压力状态为True的设备数量、设备名称和压力类型
        return true_count, true_function, true_yali

    # 调用pan_duan函数，获取初始的压力状态信息
    true_count, true_function, true_yali = pan_duan()
    # 初始化故障发生标志为False
    fault_occurred = False

    # 如果只有一个设备的压力状态为True
    if true_count == 1:
        # 记录开始时间
        start_time = time.time()
        # 在接下来的10秒内持续检查
        while time.time() - start_time < 10:
            # 再次调用pan_duan函数，获取当前的压力状态信息
            current_true_count, current_func, current_yali = pan_duan()
            # 如果压力状态为True的设备数量不再是1，跳出循环
            if current_true_count != 1:
                break
            # 暂停1秒后继续检查
            time.sleep(1)
        # 检查标准流量值字典中的所有值是否都不为0，并且存在压力状态为True的设备
        if all(value != 0 for value in standard_flow_values.values()) and true_function:
            # 获取压力状态为True的设备的标准流量值
            std_value = standard_flow_values.get(true_function, 0)
            if std_value != 0:
                # 打印液缸串漏的信息
                print(f"{true_function} 的液缸串漏**************************************************")
                # 构造故障信息
                fault_info = {
                    "gu_zhang_ming_cheng": "液缸串漏",  # 故障名称
                    "she_bei_ming_cheng": true_function,  # 设备名称
                    "she_bei_qu_yu": "液压系统",  # 设备所在区域
                    "gu_zhang_shi_jian": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),  # 故障发生时间
                    "gu_zhang_lei_xing": "串漏",  # 故障类型
                    "shi_ji_zhi": 1,  # 实际值，假设以1表示存在串漏（可根据实际调整）
                    "gao_jing_zhi": 0,  # 警戒值，正常状态为0（无串漏）
                    "gu_zhang_miao_shu": f"{true_function} 液缸发生串漏",  # 故障描述
                    "chu_li_zhuang_tai": "未处理"  # 处理状态
                }
                # 调用send_fault_to_api函数，将故障信息推送到API
                send_fault_to_api(fault_info)
                # 将故障发生标志设置为True
                fault_occurred = True

    # 返回主流量值和一个字典，字典中记录了压力状态为True的设备是否发生故障
    return main_flow_rate, {true_function: fault_occurred}

# 调用ye_gang_chuan_lou函数进行液缸串漏检测
ye_gang_chuan_lou()